package com.cn.data.proxy.jdk.natives;

import com.cn.data.proxy.jdk.DataService;
import com.cn.data.proxy.jdk.DataServiceImpl;
import sun.misc.ProxyGenerator;

import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Proxy;

/**
 * @Author: chenl
 * @Date: 2019/12/27 0:05
 */
public class ProxyUtils {


    public static void main(String[] args) throws IOException {

        DataService proxy =
                (DataService) Proxy.newProxyInstance(ProxyUtils.class.getClassLoader(),
                        new Class[]{DataService.class},
                        new CustomProxyInvocationHandler(new DataServiceImpl()));


        proxy.proxyParam("1");
        /**
         *
         *  jdk的动态代理是通过接口反射获取到字节码，并且生成代理对象
         *  实现类里的非接口的方法是不会被代理的，原因参考上一句话
         *  代理对象 proxy0 extends proxy implement 目标接口
         * //        proxy.proxyParam("1", "2");这个是实现类的方法，是jdk动态代理是没有办法代理的
         */


        /**
         * 生产下代理类长啥样
         */

        byte[] bytes = ProxyGenerator.generateProxyClass("proxy0",  new Class[]{DataService.class}, 18);

        FileOutputStream fileOutputStream = new FileOutputStream("F:\\proxy0.class");
        fileOutputStream.write(bytes);
        fileOutputStream.flush();
        fileOutputStream.close();
    }
}
